<template>
  <div>
    <!-- 模板里不需要写this，模板中可以获取到VC的所有属性 -->
    <h1>当前求和为: {{ sum }}</h1>
    <!-- 获取store中的getters属性（和state是同级） -->
    <h3>当前求和放大十倍为: {{ BigSum }}</h3>
    <h3>我在{{ school }}，学习{{ subject }}</h3>

    <select v-model="n">
      <!-- 添加v-bind作为表达式使用 -->
      <option :value="1">1</option>
      <option :value="2">2</option>
      <option :value="3">3</option>
    </select>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
    <button @click="allAdd">总数为奇数时再加</button>
    <button @click="waitAdd">延迟添加</button>
  </div>
</template>

<script>
import { mapState, mapGetters } from 'vuex';

export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Count",
  data() {
    return {
      n: 1,
    };
  },
  computed: {
    // 使用计算属性声明Vuex数据，重复。   可简写，引出mapState

    // he() {
    //   return this.$store.state.sum
    // },
    // xuexiao() {
    //   return this.$store.state.school
    // },
    // xueke() {
    //   return this.$store.state.subject
    // },

    // 1：ES6的语法，将对象中的数据依次取出并放入指定位置（顺序一致）
    // ...mapState({
    //   he: 'sum',
    //   xuexiao: 'school',
    //   xueke: 'subject'
    // }),


    // 2：名字相同，可进一步简化（ES6中对象值为字符串无法简写，只能简写对象）
    // 这里简写是Vuex提供支持的，放入一个数组中，表示生成的属性名和获取的名字相同
    ...mapState(['sum', 'school', 'subject']),




    // 注意：mapState只能简化从state获取的代码，开发者工具会特殊区分展示
    // bigSum() {
    //   return this.$store.getters.BigSum
    // },

    // 3：同理，mapGetters是专门针对于getters的简写获取
    ...mapGetters(['BigSum'])

  },
  methods: {
    increment() {
      this.$store.commit('JIA', this.n)
    },
    decrement() {
      this.$store.commit('JIAN', this.n)
    },
    allAdd() {
      //奇数时再加，业务逻辑放在action中处理
      this.$store.dispatch('jiaOdd', this.n)
    },
    waitAdd() {
      this.$store.dispatch('jiaWait', this.n)
    },
  },
  mounted() {
    // 先声明一个对象，然后本质这两个参数都是字符串
    // 第一个参数是自己需要的计算属性名
    // 第二个参数是要找的数据的属性名（一定要字符串）
    const x = mapState({
      he: 'sum',
      xuexiao: 'school',
      xueke: 'subject'
    })
    // 值是一个函数，不用关注函数名
    console.log('mapstate', x)
  }
};
</script>

<style>
bottom {
  margin-left: 5px;
}
</style>
